Skip to main content

libobs_wrapper\data\properties/
prop_impl.rs

1use std::{collections::HashMap, sync::Arc};
2
3use crate::{
4    data::{object::ObsObjectTrait, output::ObsOutputRef, properties::_ObsPropertiesDropGuard},
5    run_with_obs,
6    runtime::ObsRuntime,
7    sources::ObsSourceTrait,
8    unsafe_send::{Sendable, SmartPointerSendable},
9    utils::{ObsError, ObsString},
10};
11
12use super::{property_ptr_to_struct, ObsProperty, ObsPropertyObject, ObsPropertyObjectPrivate};
13
14impl<K: ObsSourceTrait> ObsPropertyObject for K {
15    fn get_properties(&self) -> Result<HashMap<String, ObsProperty>, ObsError> {
16        let properties_raw = self.get_properties_raw()?;
17        property_ptr_to_struct(properties_raw, self.runtime().clone())
18    }
19}
20
21impl<K: ObsSourceTrait> ObsPropertyObjectPrivate for K {
22    fn get_properties_raw(
23        &self,
24    ) -> Result<SmartPointerSendable<*mut libobs::obs_properties_t>, ObsError> {
25        let source_ptr = self.__native_handle();
26        let runtime = self.runtime().clone();
27
28        let raw_ptr = run_with_obs!(runtime, (source_ptr), move || {
29            let source_ptr = source_ptr;
30            let property_ptr = unsafe {
31                // Safety: Safe because of smart pointer
32                libobs::obs_source_properties(source_ptr.get_ptr())
33            };
34
35            if property_ptr.is_null() {
36                Err(ObsError::NullPointer(None))
37            } else {
38                Ok(Sendable(property_ptr))
39            }
40        })??;
41
42        let drop_guard = Arc::new(_ObsPropertiesDropGuard {
43            properties: raw_ptr.clone(),
44            runtime: self.runtime().clone(),
45        });
46
47        Ok(SmartPointerSendable::new(
48            raw_ptr.0,
49            drop_guard,
50            self.runtime().native_registry(),
51        ))
52    }
53
54    fn get_properties_by_id_raw<T: Into<ObsString> + Sync + Send>(
55        id: T,
56        runtime: ObsRuntime,
57    ) -> Result<SmartPointerSendable<*mut libobs::obs_properties_t>, ObsError> {
58        let id: ObsString = id.into();
59        let raw_ptr = run_with_obs!(runtime, (id), move || {
60            let id_ptr = id.as_ptr();
61            let property_ptr = unsafe {
62                // Safety: Safe because of smart pointer
63                libobs::obs_get_source_properties(id_ptr.0)
64            };
65
66            if property_ptr.is_null() {
67                Err(ObsError::NullPointer(None))
68            } else {
69                Ok(Sendable(property_ptr))
70            }
71        })??;
72
73        let drop_guard = _ObsPropertiesDropGuard {
74            properties: raw_ptr.clone(),
75            runtime: runtime.clone(),
76        };
77
78        let ptr =
79            SmartPointerSendable::new(raw_ptr.0, Arc::new(drop_guard), runtime.native_registry());
80        Ok(ptr)
81    }
82}
83
84impl ObsPropertyObject for ObsOutputRef {
85    fn get_properties(&self) -> Result<HashMap<String, ObsProperty>, ObsError> {
86        let properties_raw = self.get_properties_raw()?;
87        property_ptr_to_struct(properties_raw, self.runtime().clone())
88    }
89}
90
91impl ObsPropertyObjectPrivate for ObsOutputRef {
92    fn get_properties_raw(
93        &self,
94    ) -> Result<SmartPointerSendable<*mut libobs::obs_properties_t>, ObsError> {
95        let output_ptr = self.__native_handle().clone();
96        let ptr = run_with_obs!(self.runtime(), (output_ptr), move || {
97            let property_ptr = unsafe {
98                // Safety: Safe because of smart pointer
99                libobs::obs_output_properties(output_ptr.get_ptr())
100            };
101
102            if property_ptr.is_null() {
103                Err(ObsError::NullPointer(None))
104            } else {
105                Ok(Sendable(property_ptr))
106            }
107        })??;
108
109        let drop_guard = Arc::new(_ObsPropertiesDropGuard {
110            properties: ptr.clone(),
111            runtime: self.runtime().clone(),
112        });
113
114        Ok(SmartPointerSendable::new(
115            ptr.0,
116            drop_guard,
117            self.runtime().native_registry(),
118        ))
119    }
120
121    fn get_properties_by_id_raw<T: Into<ObsString> + Sync + Send>(
122        id: T,
123        runtime: ObsRuntime,
124    ) -> Result<SmartPointerSendable<*mut libobs::obs_properties_t>, ObsError> {
125        let id: ObsString = id.into();
126        let ptr = run_with_obs!(runtime, (id), move || {
127            let id_ptr = id.as_ptr();
128            let property_ptr = unsafe {
129                // Safety: Safe because of smart pointer
130                libobs::obs_get_output_properties(id_ptr.0)
131            };
132
133            if property_ptr.is_null() {
134                Err(ObsError::NullPointer(None))
135            } else {
136                Ok(Sendable(property_ptr))
137            }
138        })??;
139
140        let drop_guard = _ObsPropertiesDropGuard {
141            properties: ptr.clone(),
142            runtime: runtime.clone(),
143        };
144
145        let ptr = SmartPointerSendable::new(ptr.0, Arc::new(drop_guard), runtime.native_registry());
146        Ok(ptr)
147    }
148}